package model

import (
	"database/sql/driver"
	"encoding/json"
	"errors"
	"gorm.io/gorm"
	"time"
)

type BaseModel struct {
	ID        int            `gorm:"column:ID;primaryKey;type:INT;IDENTITY(1,1);comment:自增主键ID" json:"id"`
	CreatedAt time.Time      `gorm:"column:CREATED_AT;type:DATETIME;autoCreateTime;comment:创建时间" json:"created_at"`
	UpdatedAt time.Time      `gorm:"column:UPDATED_AT;type:DATETIME;autoUpdateTime;comment:更新时间" json:"updated_at"`
	DeletedAt gorm.DeletedAt `gorm:"column:DELETED_AT;type:DATETIME;index;comment:软删除时间" json:"deleted_at,omitempty"`
}

type CalcRule struct {
	Func       string `json:"func"`               // 处理函数：sum/count/avg/max/min
	Field      string `json:"field,omitempty"`    // 参与计算的字段（如"amount"）
	Filter     string `json:"filter,omitempty"`   // 过滤条件（如"status='success'"）
	GroupBy    string `json:"group_by,omitempty"` // 分组方式（边属性固定为"source,target"）
	ResultType string `json:"result_type"`        // 结果类型：int/float/string
}

func (c CalcRule) Value() (driver.Value, error) {
	return json.Marshal(c)
}

// Scan
// 实现gorm的Scanner接口，将JSON字符串转为CalcRule
func (c *CalcRule) Scan(value interface{}) error {
	if value == nil {
		return nil
	}
	b, ok := value.([]byte)
	if !ok {
		return errors.New("type assertion to []byte failed")
	}
	return json.Unmarshal(b, &c)
}
